<? include_once('../../../config.php');include_once('../../../ldapConnect.php');

/**
 * Controlador para la búsqueda de canciones.
 * Recoge los parámetros desde la vista y hace uso del modelo para la búsqueda de canciones.
 * Obtiene del modelo los datos necesarios a mostrar en la interfaz.
 *
 * @package html
 *
 */
class BusquedaCanciones extends Controlador{

	/**
	 * Opciones recogidas para hacerlas visibles fuera de la clase
	 * @var array indexado por nombres de opción
	 */
	public $opt;

	/**
	 * Datos a mostrar en la vista, tales como los desplegables
	 * @var array indexado por nombre de la lista
	 */
	public $datos;

	/**
	 * Iterador sobre los canciones. Objeto utilizado para obtener las listas y realizar la búsqueda de canciones
	 * @var ListaCanciones
	 */
	public $ListaCanciones;
	/**
	 * Constructor de la clase
         * Las opciones enviadas se utilizan para la búsqueda y las acciones que se deseean realizar.
         * Las opciones enviadas por get se utilizan para buscar las canciones favoritas.
	 *
	 */
	public function __construct($opciones){//FB::info($opciones,'opciones recibidas');

            try{
		parent::__construct();

		$this->ListaCanciones = new ListaCanciones();

		$this->obtener_Datos();

		$this->obtener_Opciones($opciones);

                $this->obtener_Variables_Paginado();

		//Hacemos los resultados visibles fuera de la clase
		$this->opt['lista_canciones'] = $this->ListaCanciones;

		if($this->opt['reproducir'])
                    $this->reproducir();
                else if($this->opt['descargar'])
                    $this->descargar();
		else if($this->opt['del_canciones'])
                    $this->eliminar();
                else if($this->opt['add_favoritas'])
                    $this->add_favoritas();
                else if($this->opt['no_favoritas'])
                    $this->del_favoritas();
                else if($this->opt['new_lista'])
                    $this->new_Lista();
                else if($this->opt['add_to_lista'])
                    $this->add_To_Lista();
                else if($this->opt['del_from_lista'])
                    $this->del_From_Lista();

		if($this->opt['buscar'])
                    $this->buscar();
                else
                    $this->buscarPorDefecto();

                //Paginado
                $total = $this->ListaCanciones->num_Resultados();
                $this->datos['total'] = $total;
                $this->datos['num_paginas'] = ceil($total / $this->opt['tam_pagina']);
                $this->obtener_Paginas_Imprimir();

            }catch(Exception $e){
                $this->opt['error'] = $e->getMessage();
            }
	}

        private function obtener_Variables_Paginado(){
            $this->datos['inicio'] = ($this->opt['pagina']-1)*$this->opt['tam_pagina'];
        }

        /**
         * Se imprime un máximo de 5 páginas alrededor de la página actual.
         * Si estamos en las páginas 1,2,3 hay que imprimir las páginas hasta 5
         * A partir de ahí hay que imprimir 2 páginas anteriores a la actual, la actual, y has las dos posteriores.
         * En el caso total_de_paginas, total_de_paginas-1 y total_de_paginas -2 hay que imprimir desde el total_de_paginas -5 hasta el final
         */
        private function obtener_Paginas_Imprimir(){
            $this->datos['paginas_imprimir'] = array();
            $n_pags = $this->datos['num_paginas']; 
            if(in_array($this->opt['pagina'], array(1,2,3))){
                for($i=1;$i<=5;$i++){
                    if($i<=$n_pags)
                        $this->datos['paginas_imprimir'][] = $i;
                }
            }else if(in_array($this->opt['pagina'], array($n_pags-2,$n_pags-1,$n_pags))){
                for($i=$n_pags-4;$i<=$n_pags;$i++)
                    if($i>0)
                        $this->datos['paginas_imprimir'][] = $i;
            }else{
                for($i=$this->opt['pagina']-2;$i<=$this->opt['pagina']+2;$i++)
                    $this->datos['paginas_imprimir'][] = $i;
            }
            
        }
	private function obtener_Datos(){
            $this->datos['generos'] = $this->ListaCanciones->lista_Generos();
	}

	private function obtener_Opciones($opciones){
            @($opciones['titulo'])?$this->opt['titulo']=$opciones['titulo']:null;
            @($opciones['artista'])?$this->opt['artista']=$opciones['artista']:null;
            @($opciones['titulo_artista'])?$this->opt['titulo_artista']=$opciones['titulo_artista']:null;
            @($opciones['fecha_desde'])?$this->opt['fecha_desde']=Fechas::date2timestamp($opciones['fecha_desde']):$this->opt['fecha_desde']=Fechas::date2timestamp(time());
            @($opciones['fecha_hasta'])?$this->opt['fecha_hasta']=Fechas::date2timestamp($opciones['fecha_hasta']):$this->opt['fecha_hasta']=Fechas::date2timestamp(time());
            @($opciones['album'])?$this->opt['album']=$opciones['album']:null;
            @($opciones['generos'])?$this->opt['generos']=$opciones['generos']:null;

            @($opciones['pagina'])?$this->opt['pagina']=$opciones['pagina']:$this->opt['pagina']=1;
            @($opciones['tam_pagina'])?$this->opt['tam_pagina']=$opciones['tam_pagina']:$this->opt['tam_pagina']=30;

            @($opciones['canciones'])?$this->opt['canciones']=$opciones['canciones']:null;
            @($opciones['reproducir'])?$this->opt['reproducir']=$opciones['reproducir']:null;
            @($opciones['descargar'])?$this->opt['descargar']=$opciones['descargar']:null;
            @($opciones['del_canciones'])?$this->opt['del_canciones']=$opciones['del_canciones']:null;
            @($opciones['add_favoritas'])?$this->opt['add_favoritas']=$opciones['add_favoritas']:null;
            @($opciones['no_favoritas'])?$this->opt['no_favoritas']=$opciones['no_favoritas']:null;
            @($opciones['new_lista'])?$this->opt['new_lista']=$opciones['new_lista']:null;
            @($opciones['add_to_lista'])?$this->opt['add_to_lista']=$opciones['add_to_lista']:null;
            @($opciones['del_from_lista'])?$this->opt['del_from_lista']=$opciones['del_from_lista']:null;
            @($opciones['load_lista'])?$this->opt['load_lista']=$opciones['load_lista']:null;
            @($opciones['id_lista'])?$this->opt['id_lista']=$opciones['id_lista']:null;
            @($opciones['id_lista_reproduccion'])?$this->opt['id_lista_reproduccion']=$opciones['id_lista_reproduccion']:null;


            @($opciones['solo_hoy'])?$this->opt['solo_hoy']=$opciones['solo_hoy']:null;

            @($opciones['buscar'])?$this->opt['buscar']=$opciones['buscar']:null;

            if(@$opciones['fav']){
                $this->opt['fav']=$opciones['fav'];
                $this->opt['fav_user']=$_SESSION['id_usuario'];
            }
            if($this->opt['id_lista_reproduccion'])
                $this->opt['lista_reproduccion'] = $this->opt['id_lista_reproduccion'];

	}

	private function buscar(){
            $this->ListaCanciones->buscar($this->opt,$this->datos['inicio'], $this->opt['tam_pagina']);
	}

	private function buscarPorDefecto(){
            $this->ListaCanciones->buscar($filtros,$this->datos['inicio'], $this->opt['tam_pagina']);
	}

        /**
         * Si no hay canciones se indica que no hay que reproducir a la vista.
         * En la vista, si tenemos la opción de reproducir se cogen las canciones y se crea el reproductor múltiple
         */
        private function reproducir(){
            if(!$this->opt['canciones']){
                $this->opt['reproducir'] = false;
                $this->opt['error'] = 'No ha seleccionado ninguna canci&oacute;n';
            }
        }

	private function descargar(){
            if($this->opt['canciones']){

                $nombre_archivo_zip="canciones.zip";

                //create the object
                $zip = new ZipArchive();
                //create the file and throw the error if unsuccessful
                if ($zip->open(UPLOAD_PATH.$nombre_archivo_zip, ZIPARCHIVE::CREATE )!==TRUE)
                    throw new Exception("No se puede abrir <$nombre_archivo_zip>\n");

                foreach($this->opt['canciones'] as $id){
                    $Cancion = new Cancion($id);
                    $contenido = $Cancion->get_Archivo();

                    $zip->addFile(UPLOAD_PATH.$Cancion->get_Id(),$Cancion->get_Nombre_Cancion());
                }

                $zip->close();
                //then send the headers to foce download the zip file
                header("Content-type: application/zip");
                header("Content-Disposition: attachment; filename=".$nombre_archivo_zip);
                header("Pragma: no-cache");
                header("Expires: 0");

                $contenido = file_get_contents(UPLOAD_PATH.$nombre_archivo_zip);
                unlink(UPLOAD_PATH.$nombre_archivo_zip);
                exit($contenido);
            }
	}

	private function eliminar(){
		if($this->opt['canciones']){
			foreach($this->opt['canciones'] as $id_cancion){
				$Cancion = new Cancion($id_cancion);
				$Cancion->del_Cancion();
			}
			$this->opt['msg_ok'] = 'Canciones eliminadas';
		}
	}

        private function add_Favoritas(){
            if($this->opt['canciones']){
                $_SESSION['Usuario']->add_Favoritas($this->opt['canciones']);

                $this->opt['msg_ok'] = 'Canciones a&ntilde;adidas a la lista de favoritas';
            }
        }

        private function del_Favoritas(){
            if($this->opt['canciones']){
                $_SESSION['Usuario']->del_Favoritas($this->opt['canciones']);

                $this->opt['msg_ok'] = 'Canciones eliminadas de la lista de favoritas';
            }
        }

        private function new_Lista(){
            
            $_SESSION['Usuario']->crear_Lista_Reproduccion($this->opt['new_lista'], $this->opt['canciones']);

            $this->opt['msg_ok'] = 'Lista de reproducci&oacute;n creada';
        }

        private function add_To_Lista(){

            $lista = new ListaReproduccion($this->opt['id_lista']);
            $lista->add_Canciones($this->opt['canciones']);

            $this->opt['msg_ok'] = 'Canciones a&ntilde;adidas a la lista de reproducci&oacute;n';
        }
        
        private function del_From_Lista(){

            $lista = new ListaReproduccion($this->opt['id_lista']);
            $lista->del_Canciones($this->opt['canciones']);

            $this->opt['msg_ok'] = 'Canciones eliminadas de la lista de reproducci&oacute;n';
        }
}
?>